"""
统计多个项目的不同人员的工作量
"""

import pandas as pd
import os
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
import warnings

warnings.filterwarnings("ignore", category=UserWarning, module='openpyxl')
# Set the font to SimHei to support CJK characters
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


# 通过输入路径，获取路径下文件的数据并合并返回一个dataFrame对象
def get_date(path):
    # 调用get_file_list()方法获取文件名列表
    file_list = get_file_list(path)
    # 调用get_file_content()方法获取文件内容，返回DataFrame对象file_content
    file_content = get_file_content(path, file_list)

    return file_content


# 在固定的路径下遍历文件夹，获取xlsx文件名列表
def get_file_list(path):
    file_list = []
    for root, dirs, files in os.walk(path):
        for file in files:
            # 默认情况下，只读取路径下的xlsx类型的文件
            if os.path.splitext(file)[1].lower() == '.xlsx':
                file_list.append(file)

    return file_list


# 通过地址+文件名列表，使用pandas库分别读取xlsx文件内容，生成并返回一个DateFrame对象
def get_file_content(path, file_list):
    # 定义一个DateFrame类型的对象file_content
    file_content = pd.DataFrame()
    for file in file_list:
        # 只读取前14列
        df = pd.read_excel(path + file)
        df = df.iloc[:, 0:14]
        # 将第2、3行删除
        df = df.drop([0, 1], axis=0)
        # 将查询的结果合并成一个DateFrame类型的对象file_content
        file_content = pd.concat([file_content, df], axis=0)

    return file_content


# 生成PDF类型的图表分析文件
def draw_charts_pdf(file_content):
    # 创建一个PdfPages对象用于写入多个图形
    pdf_pages = PdfPages('E:/个人/个人代码/data/output/项目工时投入统计表.pdf')
    unique_project_list = file_content.drop_duplicates(subset='项目名称')['项目名称'].to_list()
    # 针对每一个项目进行单独处理
    for project in unique_project_list:
        # 按过滤后的项目进行处理
        file_content_singleproject = file_content[file_content['项目名称'] == project]

        # 将"年份"和"月份"两列合并成为一个新列“年月”
        file_content_singleproject['年月'] = (file_content_singleproject['年份'].astype(int)).astype(str) + '年' + (file_content_singleproject['月份'].astype(int)).astype(str) + '月'

        # 按“年份、月份”两个维度，统计“个人小计”列的和
        grouped_month = file_content_singleproject.groupby(['年月'])['个人小计'].sum()
        plt.figure(figsize=(10, 10))
        plt.bar(x=grouped_month.index, height=grouped_month.values, width=0.5)
        # 为每个柱子添加标签
        for i, v in enumerate(grouped_month.values):
            plt.text(i, v, "{:.1f}".format(v), ha='center', va='bottom', fontsize=6)
        # 生成柱状图的图例
        plt.xticks(fontsize=10, rotation=90)
        plt.xlabel('年月')
        plt.ylabel('工作量')
        plt.title(project + '每月实际工时投入')
        pdf_pages.savefig()
        plt.close()

        # 按个人维度统计工作量
        # 按个人总投入生成柱状图
        grouped_singleperson = file_content_singleproject.groupby('姓名')['个人小计'].sum()
        plt.figure(figsize=(10, 10))
        plt.bar(x=grouped_singleperson.index, height=grouped_singleperson.values, width=0.5)
        # 为每个柱子添加标签
        for i, v in enumerate(grouped_singleperson.values):
            plt.text(i, v, "{:.1f}".format(v), ha='center', va='bottom', fontsize=6)
        # 生成柱状图的图例
        plt.xticks(fontsize=10, rotation=90)
        plt.xlabel('姓名')
        plt.ylabel('工作量（人月）')
        plt.title(project + '按个人工时投入统计')
        pdf_pages.savefig()
        plt.close()

        # 按项目角色总投入生成柱状图
        grouped_singleperson = file_content_singleproject.groupby('项目角色')['个人小计'].sum()
        # 按循环生成每一个饼状图
        plt.figure(figsize=(10, 10))
        plt.pie(grouped_singleperson, labels=grouped_singleperson.index, autopct='%1.1f%%', shadow=False, startangle=90)
        # 生成饼状图的图例
        plt.legend(loc='upper right')
        plt.title(project + '按角色工时投入统计')
        pdf_pages.savefig()
        plt.close()

    # 最后关闭PDF文件
    pdf_pages.close()


path = 'E:/个人/个人代码/data/workload/'

# 获取数据
data = get_date(path)

# 形成统计图表
draw_charts_pdf(data)
